    ORG 0
    LJMP main

    ORG 000BH
    LJMP timer_int

    ORG 0030H
main:
    MOV DPTR, #SEGTABLE
    
    MOV R0, #0
    MOV R1, #0
    MOV R2, #0
    MOV R3, #0

    MOV R4, #0

    MOV TMOD, #01H
    MOV TH0, #3CH
    MOV TL0, #0B0H
    SETB TR0    ; 定时器 0 开始工作
    SETB ET0    ; 开放 T0 中断
    SETB EA     ; 开放中断总开关

    main_loop:
        LCALL printing
        CJNE R4, #2, not_yet_clock
        
        real_clock:     ; 够 100 ms 了
            MOV R4, #0
            INC R0
            LCALL formating

        not_yet_clock:
        
        JMP main_loop

formating:
    ; 将 R3, R2, R1, R0 格式化

    CJNE R0, #10, fmt_ret
    MOV R0, #0
    INC R1
    
    CJNE R1, #10, fmt_ret
    MOV R1, #0
    INC R2

    CJNE R2, #10, fmt_ret
    MOV R2, #0
    INC R3

    CJNE R3, #10, fmt_ret
    MOV R3, #0
    
    fmt_ret:

    RET


printing:
    ; 将 R3, R2, R1, R0 显示到 LED 屏
    ; 改动寄存器 A, P2, P1
    ; 只读寄存器 DPTR, R3, R2, R1, R0

    MOV P2, #0          ; 清除内容
    MOV A, R0           
    MOVC A, @A + DPTR
    MOV P1, A
    MOV P2, #80H        ; 显示到第 1 位

    MOV P2, #0
    MOV A, R1
    MOVC A, @A + DPTR
    ANL A, #7FH         ; 显示小数点
    MOV P1, A
    MOV P2, #40H
    
    MOV P2, #0
    CJNE R2, #0, display_r2
    CJNE R3, #0, display_r2 ; 如果 R3 有值，那么 R2 不能不显示，即 10x.y 这样
    JMP skip_r2

    display_r2:
        MOV A, R2
        MOVC A, @A + DPTR
        MOV P1, A
        MOV P2, #20H
    skip_r2:

    MOV P2, #0
    CJNE R3, #0, display_r3
    JMP skip_r3
    display_r3:
        MOV A, R3
        MOVC A, @A + DPTR
        MOV P1, A
        MOV P2, #10H
    skip_r3:
    RET

SEGTABLE:
    DB 0C0H ; 0
    DB 0F9H ; 1
    DB 0A4H ; 2
    DB 0B0H ; 3
    DB 99H  ; 4
    DB 92H  ; 5
    DB 82H  ; 6
    DB 0F8H ; 7
    DB 80H  ; 8
    DB 90H  ; 9
    DB 0C7H ; L
    DB 89H  ; H

timer_int:
    MOV TH0, #3CH
    MOV TL0, #0B0H
    INC R4
    RETI


    END